from django.contrib.auth.models import User
from django.db import models


# Create your models here.
# 继承 models.Model 成为模型类
# 创建完模型之后都需要迁移映射到数据库
"""
int  --> IntegerField   整数类型
varchar --> CharField   字符类型
longtext --> TextField  文本类型
date --> DateField  日期类型
BooleanField -->    布尔类型
DateTime -->        日期时间类型
ImageField -->       图片文件类型
FileField -->       文件类型
AutoField -->       自增长类型

字段的常用属性 表属性
unique: 唯一约束
null: 默认是非空 指定为True
primary_key: 主键
default: 设置默认值
blank: 表单提交的值可以为空
datafield.autonow: 每次修改都会将当前的时间更新进去
datafield.qutonow_add: 第一次会添加，将当前时间设置进去，以后不会修改这个值
"""


# 创建文章分类模型
class Classes(models.Model):
    # 自增字段 设置自增长约束 主键约束
    # id = models.AutoField(primary_key=True)
    # 字段名 限制最长字段值为30 默认都有非空约束 设置可以为空 null=True
    name = models.CharField(max_length=100, unique=True)
    # 创建时间 默认为当前时间
    # create_time = models.DateTimeField(auto_now_add=True)

    # class Meta:
    #     app_label = "demo"   # 修改为与实际路径一致
        # 或者直接删除这一行，让Django自动推断

    # 重写输出魔法方法
    def __str__(self):
        return self.name


# 创建标签模型
class Label(models.Model):
    name = models.CharField(max_length=30, unique=True)

    # 重写输出魔法方法
    def __str__(self):
        return self.name


# 创建用户详情表
class UserDetail(models.Model):
    # 用户年龄 blank=True 表单提交可以为空 null=True 数据库字段可以为空
    age = models.IntegerField(null=True, blank=True)
    # 用户性别 blank=True 表单提交可以为空 null=True 数据库字段可以为空
    sex = models.CharField(max_length=10, null=True, blank=True)
    # 关联用户表 指定user表的数据被删除时，用户详情表数据也删除
    user = models.OneToOneField(User, on_delete=models.CASCADE)


# 创建文章模型
class Article(models.Model):
    # 文章标题
    title = models.CharField(max_length=50)
    # 文章简介
    desc = models.CharField(max_length=255)
    # 文章内容
    content = models.TextField()
    # 封面图 实际保存的是图片的地址 路由 图片保存在服务器当中
    cover = models.TextField()

    # 创建时间 默认当前时间 不能被修改
    create_time = models.DateTimeField(auto_now_add=True)
    # 更新时间 默认当前时间 被修改
    update_time = models.DateTimeField(auto_now=True)

    # 建立表关系 一对多关系
    # 跟文章分类表的表约束 NOT_PROVIDED 当分类表删除时，如果还有文章，限制分类不能被删除
    # 第一个参数指定外键关联的表 默认是当前表 第二个参数指定外键关联的字段
    # related_name="classes_set" 自定义管理器的名称
    classes = models.ForeignKey(Classes, on_delete=models.NOT_PROVIDED)

    # 跟用户表的表约束 当用户被删除时，用户数据一起被删除
    # ForeignKey 外键关联 默认是当前表
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    # 多对多表关系建立 建立删除行为 因为多对多会产生关系表
    # 使用 ManyToManyField 关系表会自动生成 使用 ForeignKey 需要手动创建关系表
    label = models.ManyToManyField(Label)

    # 重写输出魔法方法
    def __str__(self):
        return self.title
